package com.mjf.datatype;

/**
 * 代码块儿：
 *  -1.代码块儿的调用的顺序 优先于 构造器
 *  -2.静态代码块儿在 类加载 的时候调用（且只会调用一次），非静态代码块儿在 创建对象 的时候调用
 *  -3.静态属性初始化与静态代码块儿优先级一样，谁写在前面谁先执行（非静态同理）
 *
 * 类加载：
 *  -1.创建对象实例时(new)
 *  -2.创建子类对象实例，父类也会被加载。 而且，父类先被加载，子类后被加载
 *  -3.使用类的静态成员时(静态属性，静态方法)
 *
 * 静态代码块、静态属性初始化、普通代码块、普通属性初始化、构造方法的调用顺序如下：
 *  1.父类的静态代码块和静态属性（优先级一样，按定义顺序执行）
 *  2.子类的静态代码块和静态属性（优先级一样，按定义顺序执行）
 *  3.父类的非静态代码块和非静态属性（优先级一样，按定义顺序执行）
 *  4.父类构造器
 *  5.子类的非静态代码块和非静态属性（优先级一样，按定义顺序执行）
 *  6.子类构造器
 */
public class CodeBlock {
    public static void main(String[] args) {

        A a = new A();// (1) A 静态代码块01 (2) getN1被调用...(3)A 普通代码块01(4)getN2被调用...(5)A() 构造器被调用

    }
}


class A {
    { //普通代码块
        System.out.println("A 普通代码块01");
    }
    private int n2 = getN2();//普通属性的初始化


    static { //静态代码块
        System.out.println("A 静态代码块01");
    }

    //静态属性的初始化
    private static  int n1 = getN1();

    public static int getN1() {
        System.out.println("getN1被调用...");
        return 100;
    }
    public int getN2() { //普通方法/非静态方法
        System.out.println("getN2被调用...");
        return 200;
    }

    //无参构造器
    public A() {
        System.out.println("A() 构造器被调用");
    }

}